package xml.dom4j;

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import java.io.InputStream;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class springTest {
    //xml文件bean中id作为键，该实例对象为值
    static Map<String, Object> map = new HashMap<>();


    public static void main(String[] args) throws Exception {

        SAXReader reader = new SAXReader();
        InputStream in = springTest.class.getClassLoader().getResourceAsStream("test_xml.xml");
        Document read = reader.read(in);
        //根节点beans
        Element rootElement = read.getRootElement();
        System.out.println(rootElement.getName());
        //bean节点
        List<Element> elements = rootElement.elements();
        for (Element element : elements) {
            //获取bean中id属性的值
            String id = element.attributeValue("id");
            //获取bean中class的值
            String className = element.attributeValue("class");
            //通过className来进行反射得到字节码文件
            Class<?> aClass = Class.forName(className);
            //将字节码文件new的对象放到map里
            map.put(id, aClass.newInstance());
        }

        for (Element element : elements) {
            //获取bean中id属性的值
            String id = element.attributeValue("id");
            //获取bean中class的值
            String className = element.attributeValue("class");
            //propertyes标签中的元素
            List<Element> propertyes = element.elements();
            if (propertyes.size() > 0) {
                for (Element propertye : propertyes) {
                    //得到propertyes标签中的name属性的值
                    String name = propertye.attributeValue("name");
                    //得到propertyes标签中的ref属性的值
                    String dao = propertye.attributeValue("ref");
                    //根据bean中的className得到的字节码文件
                    Class<?> aClass = Class.forName(className);
                    //获得aClass的成员变量对象
                    Field field = aClass.getDeclaredField(name);
                    //通过bean标签中的id获得对象
                    Object obj = map.get(id);
                    //通过propertyes标签中的ref获得对象
                    Object arg = map.get(dao);
                    //使用反射将成员对象变量赋值
                    field.set(obj, arg);
                    System.out.println(field);
                }
            }
/*使用反射调用set方法注入　　　　　　　　if(propertys.size()>0){    　　　　　　for (Element property:propertys){        　　　　String name = property.attributeValue("name");        　　　　String ref = property.attributeValue("ref");        　　　　Object o = map.get(id);        　　　　Object oo=map.get(ref);        　　　　String methodName="set"+name.substring(0,1).toUpperCase()+name.substring(1);        　　　　System.out.println(methodName);        　　　　Class<?> aClass = Class.forName(className);        　　　　Method method = aClass.getMethod(methodName,oo.getClass().getInterfaces());
        　　　　System.out.println(method);        　　　　Object invoke = method.invoke(o, oo);        　　　　System.out.println(invoke);   　　　　 }　　　　}*/

        }
    }

}
